package com.rickpan.storage.task;

import com.rickpan.storage.multipart.MinIOMultipartUploadManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 多部分上传清理任务
 * 定期清理过期的多部分上传会话
 */
@Component
@ConditionalOnProperty(name = "app.storage.type", havingValue = "minio")
public class MultipartUploadCleanupTask {
    
    private static final Logger logger = LoggerFactory.getLogger(MultipartUploadCleanupTask.class);
    
    @Autowired
    private MinIOMultipartUploadManager multipartUploadManager;
    
    // 多部分上传会话最大存活时间：24小时
    private static final long MAX_SESSION_AGE_MILLIS = 24 * 60 * 60 * 1000L;
    
    /**
     * 每小时执行一次清理任务
     */
    @Scheduled(fixedRate = 60 * 60 * 1000) // 1小时
    public void cleanupExpiredSessions() {
        try {
            logger.debug("开始清理过期的多部分上传会话");
            
            int activeSessions = multipartUploadManager.getActiveSessionCount();
            logger.debug("当前活跃的多部分上传会话数: {}", activeSessions);
            
            if (activeSessions > 0) {
                multipartUploadManager.cleanupExpiredSessions(MAX_SESSION_AGE_MILLIS);
                
                int remainingSessions = multipartUploadManager.getActiveSessionCount();
                int cleanedSessions = activeSessions - remainingSessions;
                
                if (cleanedSessions > 0) {
                    logger.info("清理了 {} 个过期的多部分上传会话，剩余 {} 个活跃会话", 
                               cleanedSessions, remainingSessions);
                } else {
                    logger.debug("没有过期的多部分上传会话需要清理");
                }
            } else {
                logger.debug("没有活跃的多部分上传会话");
            }
            
        } catch (Exception e) {
            logger.error("清理过期多部分上传会话时发生错误", e);
        }
    }
    
    /**
     * 每天凌晨2点执行深度清理
     * 清理可能遗漏的 MinIO 服务器端未完成的多部分上传
     */
    @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点
    public void deepCleanup() {
        try {
            logger.info("开始执行多部分上传深度清理");
            
            // 这里可以添加更深度的清理逻辑
            // 例如：调用 MinIO API 列出所有未完成的多部分上传并清理
            
            logger.info("多部分上传深度清理完成");
            
        } catch (Exception e) {
            logger.error("多部分上传深度清理时发生错误", e);
        }
    }
}
